package team.hyznrj.studentsys.entity;

import java.util.HashMap;
import java.util.Map;

import com.google.gson.annotations.Expose;

import lombok.Data;
import lombok.ToString;
import team.hyznrj.studentsys.dto.CourseDto;

@Data
@ToString
public class CourseEntity {
	@Expose
	public final static String[] pattern={"必修","限选","专业任选","体育"};
	/**
	 * 学号
	 */
	private String sno;
	/**
	 * 学年
	 */
	private String academicYear;
	/**
	 * 学期
	 */
	private Integer item;
	/**
	 * 成绩详情(按 选修/必修/专业任选/体育/...)
	 * 必修如果是 体育课，也必须分出来
	 */
	private Map<String,Map<String,CourseDto>> courseMessages=new HashMap<>();
	/**
	 * 全部成绩映射
	 */
	private Map<String,Double> allCourse=new HashMap<>();
	/**
	 * 主成绩累计(必修，限选，专业任选)
	 */
	private int countMain=0;
	/**
	 * 总科目分*绩点
	 */
	private double mainGrade=0.0;
	/**
	 * 总科目分
	 */
	private double pointGrade=0.0;
	/**
	 * 平均绩点
	 */
	private double avgGrade=0.0;
	/**
	 * 体育分累计
	 */
	private int countPE=0;
	private double peGrade=0.0;
	/**
	 * 是否挂科标志
	 */
	private int ggNum=0;
	
	/**
	 * 如果分值是空，则返回true
	 * @return
	 */
	public boolean isNullEntity(){
		if(countPE==0&&(allCourse==null||allCourse.size()==0)){
			return true;
		}else{
			return false;
		}
	}
	
	
	public boolean isMustCount(final String curriculumNature){
		for(int i=0;i<pattern.length&&i<3;i++){
			if(pattern[i].equals(curriculumNature)){
				return true;
			}
		}
		return false;
	}
	public void putIntoCourseMessages(final CourseDto entity){
		if(entity==null){
			return ;
		}
		/**
		 * 放入全部成绩中
		 */
		allCourse.put(entity.getCourseTitle(), entity.getConvertMark().doubleValue());
		/**
		 * 判断是否挂科
		 */
		if(entity.getConvertMark().doubleValue()<60){
			ggNum++;
		}
		/**
		 * 将折算成绩放入个人成绩中
		 */
		Map<String,CourseDto> map=null;
		String curriculumNature = entity.getCurriculumNature();
		if(courseMessages.containsKey(curriculumNature)){
			map = courseMessages.get(curriculumNature);
		}else{
			map=new HashMap<>();
			courseMessages.put(curriculumNature, map);
		}
		map.put(entity.getCourseTitle(),entity);
		/**
		 * 插入数据时更新总成绩
		 */
		for(int i=0;i<pattern.length;i++){
			if(pattern[i].equals(curriculumNature)&&i<3){
				countMain++;
				/**
				 * 科目分*绩点
				 */
				mainGrade+=entity.getCourseCredit().doubleValue()*
						entity.getCourseGradePoint().doubleValue();
				pointGrade+=entity.getCourseCredit().doubleValue();
				avgGrade=mainGrade/pointGrade;
			}else if(pattern[i].equals(curriculumNature)&&i==3){
				countPE++;
				peGrade+=entity.getCourseGradePoint().doubleValue();
			}
		}
	}
}

